package com.itzhouwei.commerce.thread.core.demo4;

import lombok.SneakyThrows;

import java.util.concurrent.TimeUnit;

/**
 * @description: 暂停线程 suspend 方法
 * @author：zw，微信公共号：yingshengzw
 * @date: 2021/8/28
 * @Copyright：公众号：搬砖暗夜码农 | 博客：https://itzhouwei.com - 沉淀、学习、分享、成长，让自己和他人都能有所收获！
 */
public class ThreadSuspendDemo {

    static  class  ThreadDemo implements Runnable{


        @Override
        public void run() {
            for (int i = 0; i <200 ; i++) {
                System.out.println("i = " + i);
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }

    /****
     * 挂起此线程。
     *
     * 首先，调用此线程的checkAccess方法时没有参数。这可能导致引发SecurityException（在当前线程中）。
     *
     * 如果线程处于活动状态，则它将被挂起，并且在恢复之前不会继续前进。
     *
     * 已弃用
     *
     * 此方法已被弃用，因为它本身就容易死锁。如果目标线程在监视器上持有一个锁，以保护挂起的关键系统资源，则在目标线程恢复之前
     * ，任何线程都不能访问该资源。如果将恢复目标线程的线程在调用resume之前试图锁定此监视器，则会导致死锁。
     * 这种死锁通常表现为“冻结”进程。有关详细信息，
     *
     *
     * 为了避免这种危险的情况发生，在后续的 JDK 版本中，开发者将 suspend 和 resume 方法声明了废弃标记。
     *
     * 从 suspend 方法的效果来看，它只是达到了一种暂停的效果，而要想实现线程的立即终止的话，可以使用 Thread 类中的 stop 函数。
     * @param args
     * @throws InterruptedException
     */
    public static void main(String[] args) throws InterruptedException {
        Thread thread=new Thread(new ThreadDemo());
        thread.start();//开启线程
        TimeUnit.SECONDS.sleep(6);
        System.err.println("thread = 线程暂停 ");
        //暂停线程
        thread.suspend();
        TimeUnit.SECONDS.sleep(2);
        //从之前暂停的位置恢复继续执行
        thread.resume();
        System.out.print(" 线程恢复");
    }
}
